# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:张广勤
@Web site: https://www.tunan.wang
@Github:www.github.com
 
@File:docx_keywords3_0.py
@Time:2024/9/2 18:54

@Motto:不积跬步无以至千里，不积小流无以成江海！
"""

from docx import Document
import os
import re
from docx.shared import Pt
from docx.oxml.ns import qn

def is_docx_empty(docx_path):
    """
    判断docx文件是否有内容
    :param docx_path: docx文件的路径
    :return: 如果文件为空返回True，否则返回False
    """
    try:
        doc = Document(docx_path)
        for para in doc.paragraphs:
            if para.text.strip():
                return False
        return True
    except Exception as e:
        print(f"处理文件时发生错误: {e}")
        return True

def extract_year(text):
    """
    从文本中提取年份
    :param text: 包含年份的文本
    :return: 年份，如果没有找到则返回None
    """
    year_pattern = r'\d{4}'
    match = re.search(year_pattern, text)
    return int(match.group()) if match else None

def sort_paragraphs_by_year(paragraphs):
    """
    对段落按照年份排序
    :param paragraphs: 段落列表
    :return: 排序后的段落列表
    """
    return sorted(paragraphs, key=lambda p: extract_year(p.text))

def search_and_extract_paragraphs(folder_path, keywords, output_docx):
    # 创建一个新的Word文档用于写入结果
    doc = Document()
    doc.styles['Normal'].font.name = '宋体'
    doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')  # 设置字体为宋体

    # 存储所有包含关键字的段落
    all_paragraphs = []

    # 遍历文件夹中的所有文件
    for filename in os.listdir(folder_path):
        if filename.endswith('.docx'):
            file_path = os.path.join(folder_path, filename)
            # 读取Word文件
            doc_to_read = Document(file_path)
            # 遍历文档中的所有段落
            for para in doc_to_read.paragraphs:
                # 检查段落文本是否包含任何关键字
                if any(keyword in para.text for keyword in keywords):
                    # 添加段落及其来源文件名
                    new_para = doc.add_paragraph()
                    new_para.add_run(f"文件: {filename}\n").bold = True
                    new_para.add_run(para.text)
                    all_paragraphs.append(new_para)

    # 按照年份排序段落
    sorted_paragraphs = sort_paragraphs_by_year(all_paragraphs)

    # 清空文档并添加排序后的段落
    doc.paragraphs.clear()
    for para in sorted_paragraphs:
        doc.add_paragraph(para.text)

    # 保存新文档
    doc.save(output_docx)
    if is_docx_empty(output_docx):
        os.remove(output_docx)
        print("文件为空,删除")
    else:
        print(f'{output_docx}文件已保存')


def join_with_underscore(items):
    # 使用join()方法拼接列表项，但首先需要将列表项转换为字符串
    # 如果列表为空，则直接返回空字符串
    if not items:
        return ""
    # 使用下划线作为分隔符来拼接列表项
    return "_".join(map(str, items))

# 使用示例
folder_path = '山西统计公报_new/'  # 替换为你的Word文件所在的文件夹路径

delimiter_pattern = re.compile(r'[，,、\s]+')

# 获取用户输入的字符串
user_input = input("请输入不多于四个变量，可用中文逗号、英文逗号、顿号或空格分隔: ")

# 使用正则表达式分割字符串
variables_list = delimiter_pattern.split(user_input)

# 去除列表中的空字符串（如果用户在分隔符之间没有输入任何内容）
variables_list = [var for var in variables_list if var]

# 假设我们只关心前三个变量（如果用户输入了更多，我们可以选择忽略）
# 注意：如果输入少于三个变量，列表将只包含实际输入的变量
if len(variables_list) > 4:
    variables_list = variables_list[:4]  # 只取前三个

keywords = variables_list
output_docx = 'output_gongbao/output_with_' + join_with_underscore(keywords) + '.docx'  # 输出文件的名称

# 调用函数
search_and_extract_paragraphs(folder_path, keywords, output_docx)